package main

import (
	"math"
	"unicode/utf8"
)

func main() {
	println("HELLO GO~")
	// a和b都是int
	//var a int = 456
	//var b int = 123
	//println(a + b)
	//println(a - b)
	//println(a / b)
	//println(a * b)
	//579
	//333
	//3
	//56088
	//var c float64 = 12.3
	// 编译不通过
	//println(a + c )
	//var d int32 = 12
	//一样编译不通过
	//println(a + d)
	//Extremum()
	//String()
	//Byte()

	//Bool()
	//VarTest()
	ConstTest()
}

// Extremum 极值
func Extremum() {
	println("float64 最大值", math.MaxFloat64)
	println("float64 最小的正数", math.SmallestNonzeroFloat64)
	println("float 32 最大值", math.MaxFloat32)
	println("float 32 最小正数", math.SmallestNonzeroFloat32)
}

func String() {
	// he said:"hello, go!"
	println("He said: \"hello, go!\"")
	println(`我可以换行
这是新的行
但是这里不能有反引导
`)
	// UTF-8是一种可变长度的编码方案，英文字符通常占用1个字节，而汉字和其他Unicode字符占用多个字节，一般情况下是3个字节。
	println(len("你好"))
	println(utf8.RuneCountInString("你好"))
	println(utf8.RuneCountInString("你好"))
}
func Byte() {
	// []byte 是一个类型，表示一个字节片段（slice of bytes）。在 Go 中，byte 是一种内置的数据类型，
	// 代表8位无符号整数，范围从 0 到 255。[]byte 可以理解为一个动态长度的字节数组，用于存储任意字节序列的数据。
	var a byte = 'a'
	//输出的是a的ASCII 表达97
	println(a)
	var str string = "this is string"
	var bs []byte = []byte(str)
	println(bs)
}

func Bool() {
	var a bool = true
	var b bool = false
	var c bool = a || b //true
	println(c)
	var d bool = a && b //false
	println(d)
	var e bool = !a
	println(e)
}

func VarTest() {
	//int 是灰色的，是因为golang自己可以做类型判断，他觉得你可以省略
	var a int = 13
	println(a)

	// 这里我们省略了类型
	var b = 14
	println(b)

	//这里uint不可省略，因为生路之后，因为不加unit类型，15会被解释为int类型
	var c uint = 15
	println(c)

	//这一句无法通过编译,因为golang是强类型语言，并且不会帮你做任何的转换
	//println(a == c)
	// Global 首字母大写，全局可以访问
	var Global = "全局变量"
	// 首字母小写，只能在这个包里面使用
	// 其子包也不能使用
	var local = "包变量"

	var (
		First  string = "abc"
		second int32  = 16
	)
	println(Global, local, First, second)

	d := 13
	println(d)
	e := "你好"
	println(e)
}

const internal = "包内访问"
const External = "包外访问"

func ConstTest() {
	const a = "你好"
	println(a)
	println(internal)
	println(External)
}

func IotaTest() {

	const (
		Status0 = iota
		Status1
		Status2
		Status3

		// 不管隔多少行，都是接着4

		Status4

		// 插入一个主动赋值的就中断了 iota
		Status6 = 6
		Status7
	)
	const (
		One = iota << 1
		Two
		Four
		Six
	)
}
